From 92b817b4553ae96b2b014444fadcb03e26dbe371 Mon Sep 17 00:00:00 2001 From: "mjw@wray-m-3.hpl.hp.com" Date: Mon, 19 Jul 2004 11:49:45 +0000 Subject: [PATCH] bitkeeper revision 1.1108.1.1 (40fbb559J4VKc_p9h4f2N4LDV9IXfg) Fix problems with persistence of vm startTime. --- tools/python/xen/xend/XendDomain.py | 31 ++++++++++++++++++------- tools/python/xen/xend/XendDomainInfo.py | 26 ++++++++++++++------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/tools/python/xen/xend/XendDomain.py b/tools/python/xen/xend/XendDomain.py index 51d52f1acc..eca6ab5a0f 100644 --- a/tools/python/xen/xend/XendDomain.py +++ b/tools/python/xen/xend/XendDomain.py @@ -179,8 +179,7 @@ class XendDomain: @param info: domain info from xen @return: deferred """ - config = sxp.child_value(savedinfo, 'config') - deferred = XendDomainInfo.vm_recreate(config, info) + deferred = XendDomainInfo.vm_recreate(savedinfo, info) def fn(dominfo): self.domain[dominfo.id] = dominfo deferred.addCallback(fn) @@ -249,20 +248,30 @@ class XendDomain: id = str(d['dom']) doms[id] = d if id not in self.domain: - config = None - deferred = XendDomainInfo.vm_recreate(config, d) + savedinfo = None + deferred = XendDomainInfo.vm_recreate(savedinfo, d) def fn(dominfo): self._add_domain(dominfo.id, dominfo) deferred.addCallback(fn) # Remove entries for domains that no longer exist. for d in self.domain.values(): - dominfo = doms.get(d.id) - if dominfo: - d.update(dominfo) + info = doms.get(d.id) + if info: + d.update(info) else: self._delete_domain(d.id) self.reap_schedule(1) + def update_domain(self, id): + """Update the saved info for a domain. + + @param id: domain id + """ + dominfo = self.domain.get(id) + if dominfo: + self.domain_db[id] = dominfo.sxpr() + self.sync_domain(id) + def refresh_domain(self, id): """Refresh information for a single domain. @@ -580,7 +589,9 @@ class XendDomain: if not dominfo: raise XendError("invalid domain:" + str(dom)) self.refresh_schedule() - return dominfo.device_create(devconfig) + val = dominfo.device_create(devconfig) + self.update_domain(dominfo.id) + return val def domain_device_destroy(self, dom, type, idx): """Destroy a device. @@ -594,7 +605,9 @@ class XendDomain: if not dominfo: raise XendError("invalid domain:" + str(dom)) self.refresh_schedule() - return dominfo.device_destroy(type, idx) + val = dominfo.device_destroy(type, idx) + self.update_domain(dominfo.id) + return val def domain_devtype_ls(self, dom, type): """Get list of device indexes for a domain. diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 47b945f200..eb36c047d9 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -253,14 +253,24 @@ def vm_create(config): vm = XendDomainInfo() return vm.construct(config) -def vm_recreate(config, info): +def vm_recreate(savedinfo, info): """Create the VM object for an existing domain. + + @param savedinfo: saved info from the domain DB + @type savedinfo: sxpr + @param info: domain info from xc + @type info: xc domain dict + @return: deferred """ vm = XendDomainInfo() vm.recreate = 1 vm.setdom(info['dom']) vm.name = info['name'] vm.memory = info['mem_kb']/1024 + start_time = sxp.child_value(savedinfo, 'start_time') + if start_time is not None: + vm.startTime = float(start_time) + config = sxp.child_value(savedinfo, 'config') if config: d = vm.construct(config) else: @@ -382,6 +392,7 @@ class XendDomainInfo: ['id', self.id], ['name', self.name], ['memory', self.memory] ] + if self.info: run = (self.info['running'] and 'r') or '-' block = (self.info['blocked'] and 'b') or '-' @@ -396,10 +407,10 @@ class XendDomainInfo: sxpr.append(['cpu', self.info['cpu']]) sxpr.append(['cpu_time', self.info['cpu_time']/1e9]) - if self.startTime: - upTime = time.time() - self.startTime - sxpr.append(['up_time', str( upTime ) ] ) - sxpr.append(['start_time', str( self.startTime ) ] ) + if self.startTime: + upTime = time.time() - self.startTime + sxpr.append(['up_time', str(upTime) ]) + sxpr.append(['start_time', str(self.startTime) ]) if self.console: sxpr.append(self.console.sxpr()) @@ -418,9 +429,6 @@ class XendDomainInfo: if self.memory is None: raise VmError('missing memory size') - if sxp.child_value( config, 'start_time' ) != None: - self.startTime = float( sxp.child_value( config, 'start_time' ) ) - self.configure_console() self.configure_restart() self.configure_backends() @@ -598,7 +606,7 @@ class XendDomainInfo: % (name, memory)) self.setdom(dom) - if self.startTime == None: + if self.startTime is None: self.startTime = time.time() def build_domain(self, ostype, kernel, ramdisk, cmdline, vifs_n): -- 2.30.2